home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
xlib04.zip
/
XLIBREF1.DOC
< prev
next >
Wrap
Text File
|
1992-11-08
|
59KB
|
1,608 lines
PART 1 of 2
-----------------------------------------------------------------------------
********* XLIB - Mode X graphics library ****************
********* ****************
********* Written By Themie Gouthas ****************
********* ****************
********* egg@dstos3.dsto.gov.au ****************
********* teg@bart.dsto.gov.au ****************
Some of the code in this library has been contributed by :
Matthew MacKenzie - matm@eng.umd.edu
Notes:
References to my employer have been removed as this library is my
own intellectual property, developed solely in my own time.
I informally reserve all rights to the code in XLIB.
-----------------------------------------------------------------------------
DISCLAIMER
This library is distributed AS IS. The author/s specifically disclaim
any responsibility for any loss of profit or any incidental, consequen-
tial or other damages.
---------------------------------------------------------------------------
INTRODUCTION
---------------------------------------------------------------------------
XLIB is a "user supported freeware" graphics library specifically designed
with game programming in mind.
It has been placed in the public domain for the benefit of all, and
represents *MANY* hours of work so it is requested that all users comply
with the the wishes of the author/s as specified in the individual modules
and:
a) To leave the code in the public domain
b) Not distribute any modified or incomplete versions of this library
New contribution and comments are welcome and hopefully there will be
more releases as the code evolves.
Finally, do not trust this excuse for a manual if in doubt, as this code has
undergone several revisions. The place to get the answers is in the code
itself.
REQUIREMENTS
Minimum requirements
286 processor,
Turbo C 2.0 or higher, or BORLANDC
MAKE 2.0 or higher
TLIB 2.0 or higher
Turbo Assembler 1.01 or higher
GENERAL FEATURES
Support for a number of 256 colour tweaked graphics mode resolutions
320x200 320x240 360x200 360x240 376x282 320x400 320x480 360x400 360x480
360x360 376x308 376x564
Please note that some of the new resolutions best suit monitors with
adjustable vertical height.
Virtual screens larger than the physical screen (memory
permitting) that can be panned at pixel resolution in all directions
A split screen capability for status displays etc.
Text functions supporting 8x8 and 8x14 ROM fonts and user defined fonts
Support for page flipping
Graphics primitives such as line and rectangle drawing functions and
of course bit block manipulation functions
MODULES COMPRISING XLIB
XMAIN - Main module containig mode setting code and basic functions
XPOINT - Pixel functions
XRECT - Filled Rectangle and VRAM to VRAM block move functions
XPAL - Palette functions
XLINE - Line Functions
XTEXT - Text and Font Functions
XPRINTF - Printf style string output
XPBITMAP - Planar Bitmap functions
XCBITMAP - Compiled Bitmap functions
XVBITMAP - Video Bitmap functions
XPBMCLIP - Clipped Planar Bitmap functions
XMAKEVBM - Support module for video bitmaps
XBMTOOLS - Bitmap format conversion tools
XDETECT - Hardware detection module
XFILEIO - File I/O functions
XRLETOOL - RLE encoding/decoding functions
XMOUSE - Mouse functions
XBEZIER - Bezier curve drawing
-------------------------------------------------------------------------
BUILDING THE LIBRARIES
-------------------------------------------------------------------------
Building the library had been made simple through the use of make.
To build and examples for one of the two models:
a) edit the makefile for the apropriate model (see note in the makefile)
b) edit the makefile for the apropriate compiler (again see note in the
makefile)
c) type "make" at the dos prompt.
It should be as simple as that. If problems are encountered then check
to see if tasm, make, tlib, link and bcc (or tcc) are withinin your path.
If not either change your path or specify the full path for these programs
in the makefile. It is preferrable to have your path set correctly.
Individual Compilation
----------------------
each ASM module can be compiled with the following commandline:
tasm /ml /d<model> <asm module name>
where <model> is s c or l. Where s = small model, c = compact model and
l = large model.
The resulting libraries are:
xlib<version>s.lib - small model library
xlib<version>c.lib - large model library
xlib<version>l.lib - large model library
To link the library with your programs just include the apropriate .lib
file in your project file or on the BCC or TCC command line.
Using the library with your programs
------------------------------------
Using the XLIB library in your programs is simple. Knowing the particular
modules you require, just include the associated header files in your program
and link your program modules with the library. If you don't want to wory
about selecting the apropriate header file then just include "XLIB_ALL.H"
which automatically includes all XLIB header files in your program.
For example compilations see the supplied makefile.
--------------------------------------------------------------------------
GLOBAL DEFINES (xlib.inc)
--------------------------------------------------------------------------
Types
BYTE unsigned char
WORD unsigned int
Available X mode resolutions
X_MODE_320x200 0
X_MODE_320x240 1
X_MODE_360x200 2
X_MODE_360x240 3
X_MODE_360x282 4
X_MODE_320x400 5
X_MODE_320x480 6
X_MODE_360x400 7
X_MODE_360x480 8
X_MODE_360x360 9
X_MODE_376x308 10
X_MODE_376x564 11
Palette rotation direction directiion
BACKWARD 0
FORWARD 1
X_MODE_INVALID -1
ERROR 1
OK 0
--------------------------------------------------------------------------
MODULE XMAIN
--------------------------------------------------------------------------
The Xmain module is the base module of the XLIB library. It contains the
essential functions that initialize and customize the graphic environment.
ASM SOURCES
xmain.asm xmain.inc xlib.inc model.inc
C HEADER FILE
xlib.h
EXPORTED VARIABLES
NOTE: All variables are read only unless otherwise specified. If you modify
them manually, the results may be unpredictable.
InGraphics - BYTE - Flag indicating that the xlib graphics system is
active. Set by function "x_set_mode".
CurrXMode - WORD - If the xlib graphics system is active, contains the id
of the x mode. Set by function "x_set_mode".
See also defines (ie X_MODE_320x200 ... )
ScrnPhysicalByteWidth - WORD - Physical screen width in bytes. Set by
function "x_set_mode"
ScrnPhysicalPixelWidth - WORD - Physical screen width in pixels. Set by
function "x_set_mode"
ScrnPhysicalHeight - WORD - Physical screen height in pixels. Set by
function "x_set_mode".
ErrorValue - WORD - Contains error value. General use variable to
communicate the error status from several functions. The value
in this variable usually is only valid for the the last
function called that sets it.
SplitScrnOffs - WORD - Offset in video ram of split screen. Set by
function "x_set_splitscrn". The value is only valid if a split
screen is active. See also global variable "SplitScrnActive".
SplitScrnScanLine - WORD - Screen Scan Line the Split Screen starts at
initially when set by function "x_set_splitscrn". The value is only
valid if a split screen is active. See also global variable
"SplitScrnActive".This variable is not updated by "x_hide_splitscrn",
"x_adjust_splitscrn".
SplitScrnVisibleHeight - WORD - The number of rows of the initial split
screen which are currently displayed. Modified by "x_hide_splitscrn",
"x_adjust_splitscrn" and "x_show_splitscrn".
Page0_Offs - WORD - Offset in video ram of main virtual screen. Initially
set by function "x_set_mode" but is updated by functions
"x_set_splitscrn" and "x_set_doublebuffer".
Page1_Offs - WORD - Offset in video ram of second virtual screen. Set by
and only is valid after a call to "x_set_doublebuffer".
ScrnLogicalByteWidth - WORD - Virtual screen width in bytes. Set by
function "x_set_mode".
ScrnLogicalPixelWidth - WORD - Virtual screen width in pixels. Set
by function "x_set_mode".
ScrnLogicalHeight - WORD - Virtual screen height in pixels. Set
initially by function "x_set_mode" but is updated by functions
"x_set_splitscrn" and "x_set_doublebuffer".
MaxScrollX - WORD - Max X pixel position of physical screen within
virtual screen. Set by function "x_set_mode".
MaxScrollY - WORD - Max Y position of physical screen within virtual
screen. Set initially by function "x_set_mode" but is updated by
functions "x_set_splitscrn" and "x_set_doublebuffer".
DoubleBufferActive - WORD - Indicates whether double-buffering is on. Set
by function "x_set_doublebuffer".
VisiblePageIdx - WORD - Index number of current visible page. Initially
set by function "x_set_doublebuffer" but is updated by "x_page_flip".
This variable is only used while double buffering is on.
HiddenPageOffs - WORD - Offset of hidden page. Initially set by function
"x_set_doublebuffer" but is updated by "x_page_flip". This variable
is only used while double buffering is on.
VisiblePageOffs - WORD - Offset of visible page. Initially set by function
"x_set_doublebuffer" but is updated by "x_page_flip". This variable
is only used while double buffering is on.
NonVisual_Offs - WORD - Offset of first byte of non-visual ram, the ram
that is available for bitmap storage etc. Set initially by function
"x_set_mode" but is updated by functions "x_set_splitscrn" and
"x_set_doublebuffer".
TopClip, BottomClip, LeftClip RightClip - WORD - Define the clipping
rectangle for Linear and Video clipped bitmap put functions. Set
either manually or by "x_set_cliprect". Note X coordinates are in
bytes as all clip functions clip to byte boundaries.
PhysicalStartPixelX - WORD - X pixel Offset of physical (visible) screen
relative to the upper left hand corner (0,0) of the virtual screen.
PhysicalStartByteX - WORD - X byte Offset of physical (visible) screen
relative to the upper left hand corner (0,0) of the virtual screen.
PhysicalStartY - WORD - Y pixel Offset of physical (visible) screen
relative to the upper left hand corner (0,0) of the virtual screen.
EXPORTED FUNCTIONS
x_set_mode
----------
C Prototype: extern WORD x_set_mode(WORD mode,WORD WidthInPixels);
mode - The required mode as defined by the "Available X Mode
resolutions" set of defines in the xlib.h header file.
WidthInPixels - The required virtual screen width.
Returns - The actual width in pixels of the allocated virtual
screen
This function initialises the graphics system, setting the apropriate
screen resolution and allocating a virtual screen. The virtual screen
allocated may not necessarily be of the same size as specified in the
"WidthInPixels" parameter as it is rounded down to the nearest
multiple of 4.
The function returns the actual width of the allocated virtual screen
in pixels if a valid mode was selected otherwise returns
X_MODE_INVALID.
Saves virtual screen pixel width in "ScrnLogicalPixelWidth".
Saves virtual screen byte width in "ScrnLogicalByteWidth".
Physical screen dimensions are set in "ScrnPhysicalPixelWidth".
"ScrnPhysicalByteWidth" and "ScrnPhysicalHeight". Other global
variables set are "CurrXMode","MaxScrollX", "MaxScrollY",
"InGraphics". The variable "SplitScrnScanline" is also initialized
to zero.
See also:
Available X Mode resolutions
What is Mode X
x_select_default_plane
----------------------
C Prototype: void x_select_default_plane(BYTE plane);
Enables default Read/Write access to a specified plane
x_set_splitscreen
-----------------
C Prototype: extern void x_set_splitscreen(WORD line);
line - The starting scan line of the required split screen.
This function activates Mode X split screen and sets starting scan
line. The split screen resides on the bottom half of the screen and has
a starting address of A000:0000 in video RAM.
It also Updates Page0_Offs to reflect the existence of the split screen
region ie "MainScrnOffset" is set to the offset of the first pixel
beyond the split screen region. Other variable set are "Page1_Offs" which
is set to the same value as "Page0_Offs" (see graphics call sequence
below), "ScrnLogicalHeight","ScrnPhysicalHeight", "SplitScrnScanLine" and
"MaxScrollY".
This function cannot be called after double buffering has been activated,
it will return an error. To configure your graphics environment the
sequence of graphics calls is as follows although either or both steps b
and c may be omitted:
a) x_set_mode
b) x_set_splitscreen
c) x_set_doublebuffer
Thus when you call this function successfully, double buffering is not
active so "Page1_Offs" is set to the same address as "Page0_Offs".
WARNING: If you use one of the high resolution modes (376x564 as an
extreme example) you may not have enough video ram for split screen
and double buffering options since VGA video RAM is restricted to
64K.
See Also:
What is a Split Screen ?
What is double buffering ?
x_set_doublebuffer
------------------
C Prototype: extern WORD x_set_doublebuffer(WORD PageHeight);
PageHeight - The height of the two double buffering virtual screens.
Returns - The closest possible height to the specified.
This function sets up two double buffering virtual pages. 'ErrorValue"
is set according to the success or failure of this command.
Other variables set are:
_Page1_Offs Offset of second virtual page
_NonVisual_Offs Offset of first non visible video ram byte
_DoubleBufferActive Flag
_PageAddrTable Table of Double buffering pages start offsets
_ScrnLogicalHeight Logical height of the double buffering pages
_MaxScrollY Max vertical start address of physical screen
within the virtual screen
WARNING: If you use one of the high resolution modes (376x564 as an
extreme example) you may not have enough video ram for split screen
and double buffering options since VGA video RAM is restricted to
64K.
See Also:
What is double buffering ?
x_hide_splitscreen
------------------
C Prototype: extern void x_hide_splitscreen(void);
This function hides an existing split screen by setting its starting
scan line to the last physical screen scan line.
"ScreenPhysicalHeight" is adjusted but the "SplitScreenScanLine" is not
altered as it is required for restoring the split screen at a later stage.
WARNING: Only to be used if SplitScrnLine has been previously called
Disabled for mode 5-11 (320x400-376x564). The memory for
the initial split screen is reserved and the size limitations
of these modes means any change in the split screen scan line
will encroach on the split screen ram
Update: Now disabled for these modes
See Also:
What is a split screen ?
x_show_splitscreen
------------------
C Prototype: extern void x_show_splitscreen(void);
Restores split screen start scan line to the initial split screen
starting scan line as set by "SplitScrnScanLine".
"ScreenPhysicalHeight" is adjusted.
WARNING: Only to be used if SplitScrnLine has been previously called
Disabled for mode 4-10 (320x400-376x564). The memory for
the initial split screen is reserved and the size limitations
of these modes means any change in the split screen scan line
will encroach on the split screen ram
x_adjust_splitscreen
--------------------
C Prototype: extern void x_adjust_splitscreen(WORD line);
line - The scan line at which the split screen is to start.
Sets the split screen start scan line to a new scan line. Valid scan lines
are between the initial split screen starting scan line and the last
physical screen scan line. "ScreenPhysicalHeight" is also adjusted.
WARNING: Only to be used if SplitScrnLine has been previously called
Disabled for mode 4-10 (320x400-376x564). The memory for
the initial split screen is reserved and the size limitations
of these modes means any change in the split screen scan line
will encroach on the split screen ram
x_set_start_addr
----------------
C Prototype: extern void x_set_start_addr(WORD X,WORD Y);
X,Y - coordinates of top left corner of physical screen within current
virtual screen.
Set Mode X non split screen physical start address within current virtual
page.
X must not exceed (Logical screen width - Physical screen width)
ie "MaxScrollX" and Y must not exceed (Logical screen height -
Physical screen height) ie "MaxScrollY"
x_page_flip
-----------
C Prototype: extern void x_page_flip(WORD X,WORD Y);
X,Y - coordinates of top left corner of physical screen within the
the hidden virtual screen if double buffering is active, or
the current virtual screen otherwise.
Sets the physical screen start address within currently hidden virtual
page and then flips pages. If double buffering is not active then this
function is functionally equivalent to "x_set_start_addr".
X must not exceed (Logical screen width - Physical screen width)
ie "MaxScrollX" and Y must not exceed (Logical screen height -
Physical screen height) ie "MaxScrollY"
x_text_mode
-----------
C Prototype: extern void x_text_mode(void);
Disables graphics mode.
x_set_cliprect
--------------
C Prototype: extern void x_set_cliprect(WORD left,WORD top,WORD right,
WORD bottom);
Defines the clipping rectangle for clipping versions of planar and video
bitmap puts.
NOTE: Compiled bitmaps cannot be clipped.
--------------------------------------------------------------------------
MODULE XPOINT
--------------------------------------------------------------------------
Point functions all MODE X 256 Color resolutions
ASM SOURCES
xpoint.asm xpoint.inc xlib.inc model.inc
C HEADER FILE
xpoint.h
EXPORTED FUNCTIONS
x_put_pix
---------
C Prototype: extern void x_put_pix(WORD X,WORD Y,WORD PageOffset,
WORD Color);
Draw a point of specified colour at coordinates X,Y
within the virtual page starting at offset PageOffset.
x_get_pix
---------
C Prototype: extern WORD x_get_pix(WORD X, WORD Y, WORD PageBase);
Read a point of at coordinates X,Y within the virtual page starting
at offset PageOffset.
--------------------------------------------------------------------------
MODULE XRECT
--------------------------------------------------------------------------
Screen rectangle display and manipulation functions
ASM SOURCES
xrect.asm xrect.inc xlib.inc model.inc
C HEADER FILE
xrect.h
EXPORTED FUNCTIONS
x_rect_pattern
--------------
C Prototype: extern void x_rect_pattern(WORD StartX, WORD StartY,
WORD EndX, WORD EndY,
WORD PageBase,BYTE far *Pattern);
StartX,StartY - Coordinates of upper left hand corner of rectangle
EndX,EndY - Coordinates of lower right hand corner of rectangle
PageBase - Offset of virtual screen
*Pattern - Pointer to the user defined pattern (16 bytes)
Mode X rectangle 4x4 pattern fill routine.
Upper left corner of pattern is always aligned to a multiple-of-4
row and column. Works on all VGAs. Uses approach of copying the
pattern to off-screen display memory, then loading the latches with
the pattern for each scan line and filling each scan line four
pixels at a time. Fills up to but not including the column at EndX
and the row at EndY. No clipping is performed.
Based on code originally published in DDJ Mag by M. Abrash
Warning the VGA memory locations PATTERN_BUFFER (A000:FFFc) to
A000:FFFF are reserved for the pattern buffer
See Also:
Doctor Dobbs Journal references.
x_rect_fill
-----------
C Prototype: extern void x_rect_fill(WORD StartX,WORD StartY,
WORD EndX,WORD EndY,
WORD PageBase,WORD color);
StartX,StartY - Coordinates of upper left hand corner of rectangle
EndX,EndY - Coordinates of lower right hand corner of rectangle
PageBase - Offset of virtual screen
Color -color to use for fill
Mode X rectangle solid color fill routine.
Based on code originally published in DDJ Mag by M. Abrash
See Also:
Doctor Dobbs Journal references.
x_cp_vid_rect
-------------
C Prototype: extern void x_cp_vid_rect(WORD SourceStartX,WORD SourceStartY,
WORD SourceEndX,WORD SourceEndY,
WORD DestStartX,WORD DestStartY,
WORD SourcePageBase,WORD DestPageBase,
WORD SourceBitmapWidth,WORD DestBitmapWidth);
StartX,StartY- Coordinates of upper left hand corner of source rectangle
EndX,EndY - Coordinates of lower right hand corner of source rectangle
DestStartX,DestStartY - Coordinates of rectangle destination
SourcePageBase - source rectangle page offset
DestPageBase - destination rectangles page offset
SourceBitmapWidth - width of bitmap within the source virtual screen
containing the source rectangle
DestBitmapWidth - width of bitmap within the dest. virtual screen
containing the destination rectangle
Mode X display memory to display memory copy
routine. Left edge of source rectangle modulo 4 must equal left edge
of destination rectangle modulo 4. Works on all VGAs. Uses approach
of reading 4 pixels at a time from the source into the latches, then
writing the latches to the destination. Copies up to but not
including the column at SrcEndX and the row at SrcEndY. No
clipping is performed. Results are not guaranteed if the source and
destination overlap.
Based on code originally published in DDJ Mag by M. Abrash
See Also:
Doctor Dobbs Journal references.
x_shift_rect
------------
C Prototype:
extern void x_shift_rect (WORD SrcLeft, WORD SrcTop,
WORD SrcRight, WORD SrcBottom,
WORD DestLeft, WORD DestTop, WORD ScreenOffs);
SrcLeft, SrcTop - Coordinates of upper left hand corner of rectangle
SrcRight, SrcBottom - Coordinates of lower right hand corner of rectangle
DestLeft, DestTop - Coordinates of upper left corner of destination
ScreenOffs - Offset of virtual screen
This function copies a rectangle of VRAM onto another area of VRAM,
even if the destination overlaps with the source. It is designed
for scrolling text up and down, and for moving large areas of screens
around in tiling systems. It rounds all horizontal coordinates to
the nearest byte (4-column chunk) for the sake of speed. This means
that it can NOT perform smooth horizontal scrolling. For that,
either scroll the whole screen (minus the split screen), or copy
smaller areas through system memory using the functions in the
XPBITMAP module.
SrcRight is rounded up, and the left edges are rounded down, to
ensure that the pixels pointed to by the arguments are inside the
the rectangle. That is, SrcRight is treated as (SrcRight+3) >> 2,
and SrcLeft as SrcLeft >> 2.
The width of the rectangle in bytes (width in pixels / 4)
cannot exceed 255.
---------------------------------------------------------------------------
MODULE XPAL
---------------------------------------------------------------------------
Palette functions for VGA 256 color modes.
All the functions in this module operate on two variations of the
pallete buffer, the raw and annotated buffers.
All those functions ending in "raw" operate on the following palette
structure:
BYTE:r0,g0,b0,r1,g1,b1,...rn,gn,bn
No reference to the starting colour index or number of colours stored
is contained in the structure.
All those functions ending in "struc" operate on the following palette
structure:
BYTE:c,BYTE:n,BYTE:r0,g0,b0,r1,g1,b1,...rn,gn,bn
where c is the starting colour and n is the number of colours stored
WARNING: There is no validity checking in these functions. The onus is
on the user to supply valid parameters to the functions.
ASM SOURCES
xpal.asm xpal.inc xlib.inc model.inc
C HEADER FILE:
xpal.h
EXPORTED FUNCTIONS
x_get_pal_raw
-------------
C Prototype: extern void x_get_pal_raw(BYTE far * pal,WORD num_colrs,
WORD start_index);
Read DAC palette into raw buffer with interrupts disabled
ie BYTE r1,g1,b1,r1,g2,b2...rn,gn,bn
WARNING: Memory for the palette buffers must all be pre-allocated.
x_get_pal_struc
---------------
C Prototype: extern void x_get_pal_struc(BYTE far * pal,WORD num_colrs,
WORD start_index);
Read DAC palette into annotated type buffer with interrupts disabled
ie BYTE colours to skip, BYTE colours to set, r1,g1,b1,r1,g2,b2...rn,gn,bn
WARNING: memory for the palette buffers must all be pre-allocated
x_put_pal_raw
-------------
C Prototype: extern void x_put_pal_raw(BYTE far * pal,WORD num_colrs,
WORD start_index);
Write DAC palette from raw buffer with interrupts disabled
ie BYTE r1,g1,b1,r1,g2,b2...rn,gn,bn
x_put_pal_struc
--------------
C Prototype: extern void x_put_pal_struc(BYTE far * pal);
Write DAC palette from annotated type buffer with interrupts disabled
ie BYTE colours to skip, BYTE colours to set, r1,g1,b1,r1,g2,b2...rn,gn,bn
x_set_rgb
---------
C Prototype: extern x_set_rgb(BYTE color,BYTE red_c,BYTE green_c,
BYTE blue_c);
Set the RGB components of a vga color
x_rot_pal_struc
---------------
C Prototype: extern void x_rot_pal_struc(BYTE far * pal,WORD direction);
Rotate annotated palette buffer entries. Direction 0 = backward,
1 = forward.
x_rot_pal_raw
-------------
C Prototype: extern x_rot_pal_raw(BYTE far * pal,WORD direction,
WORD num_colrs);
Rotate a raw palette buffer. Direction 0 = backward,
1 = forward.
x_put_contrast_pal_struc
------------------------
C Prototype: extern void x_put_contrast_pal_struc(BYTE far * pal,
BYTE intensity);
Write DAC palette from annotated type buffer with specified intensity
adjustment (ie palette entries are decremented where possible by
"intensity" units).
Designed for fading in or out a palette without using an intermediate
working palette buffer ! (Slow but memory efficient ... OK for small
pal strucs}
x_transpose_pal_struc
---------------------
C Prototype: extern void x_transpose_pal_struc(BYTE far * pal,
WORD StartColor);
Write DAC palette from annotated type buffer with interrupts disabled
starting at a new palette index.
x_cpcontrast_pal_struc
----------------------
C Prototype: extern WORD x_cpcontrast_pal_struc(BYTE far *src_pal,
BYTE far *dest_pal,BYTE Intensity);
Copy one annotated palette buffer to another making the intensity
adjustment. Used in fading in and out fast and smoothly.
---------------------------------------------------------------------------
MODULE XLINE
---------------------------------------------------------------------------
Line Drawing functions.
ASM SOURCES
xline.asm xline.inc xlib.inc model.inc
C HEADER FILE
xline.h
EXPORTED FUNCTIONS
x_line
------
C Prototype: extern void x_line(WORD x0,WORD y0,WORD x1,WORD y1,
WORD color,WORD PageBase);
Draw a line with the specified end points in the page starting at
offset "PageBase".
No Clipping is performed.
---------------------------------------------------------------------------
MODULE XTEXT
---------------------------------------------------------------------------
ASM SOURCES
xtext.asm xtext.inc xlib.inc model.inc
C HEADER FILE
xtext.h
MACROS
FONT_8x8 0
FONT_8x15 1
FONT_USER 2
EXPORTED VARIABLES
NOTE: All variables are read only. I you modify them the results may
be unpredictable.
CharHeight - BYTE - Height of current inbuilt character set
CharWidth - BYTE - Width of current inbuilt character set
FirstChar - BYTE - First character of current inbuilt character set
UserCharHeight - BYTE - Height of current user character set
UserCharWidth - BYTE - Width of current user character set
UserFirstCh - BYTE - First character of current user character set
EXPORTED FUNCTIONS
x_text_init
-----------
C Prototype: extern WORD x_text_init(void);
Initializes the Mode X text driver and sets the default font (VGA ROM 8x8)
x_set_font
----------
C Prototype: extern void x_set_font(WORD FontId);
Select the working font where 0 = VGA ROM 8x8, 1 = VGA ROM 8x14
2 = User defined bitmapped font.
WARNING: A user font must be registered before setting FontID 2
See Also:
Defines for this module
x_register_userfont
-------------------
C Prototype: extern void x_register_userfont(char far *UserFontPtr);
Register a user font for later selection. Only one user font can be
registered at any given time. Registering a user font deregisters the
previous user font. User fonts may be at most 8 pixels wide.
USER FONT STRUCTURE
Word: ascii code of first char in font
Byte: Height of chars in font
Byte: Width of chars in font
n*h*Byte: the font data where n = number of chars and h = height
of chars
WARNING: The onus is on the program to ensure that all characters
drawn whilst this font is active, are within the range of
characters defined.
x_put_char
----------
C Prototype: extern void x_put_char(char ch,WORD X,WORD Y,WORD PgOffs,
WORD Color);
Draw a text character at the specified location with the specified
color.
ch - char to draw
x,y - screen coords at which to draw ch
ScrnOffs - Starting offset of page on whih to draw
Color - Color of the text
WARNING: InitTextDriver must be called before using this function
**** NOTE ****
The file "xprintf.c" implements a printf style formatted output function
x_printf
--------
C Prototype: void x_printf(int x,int y,unsigned ScrnOffs,int color,
char *ln,...);
x,y - screen coords at which to draw ch
ScrnOffs - Starting offset of page on whih to draw
Color - Color of the text
Parameters beyond Color conform to the standard printf parameters.
x_bgprintf
----------
C Prototype: void x_bgprintf(int x,int y,unsigned ScrnOffs,int fgcolor,
int bgcolor, char *ln,...);
x,y - screen coords at which to draw ch
ScrnOffs - Starting offset of page on whih to draw
fgcolor - Color of the text foreground
bgcolor - Color of the text background
Parameters beyond bgolor conform to the standard printf parameters.
--------------------------------------------------------------------------
MODULE XPBITMAP
--------------------------------------------------------------------------
This module implements a set of functions to operate on planar bitmaps.
Planar bitmaps as used by these functions have the following structure:
BYTE 0 The bitmap width in bytes (4 pixel groups) range 1..255
BYTE 1 The bitmap height in rows range 1..255
BYTE 2..n1 The plane 0 pixels width*height bytes
BYTE n1..n2 The plane 1 pixels width*height bytes
BYTE n2..n3 The plane 2 pixels width*height bytes
BYTE n3..n4 The plane 3 pixels width*height bytes
These functions provide the fastest possible bitmap blts from system ram to
to video and further, the single bitmap is applicable to all pixel
allignments. The masked functions do not need separate masks since all non
zero pixels are considered to be masking pixels, hence if a pixel is 0 the
corresponding screen destination pixel is left unchanged.
ASM SOURCES
xpbitmap.asm xpbitmap.inc xlib.inc model.inc
C HEADER FILE
xpbitmap.h
EXPORT FUNCTIONS
x_put_masked_pbm
----------------
C Prototype: extern void x_put_masked_pbm(WORD X,WORD Y,WORD ScrnOffs,
BYTE far * Bitmap);
Mask write a planar bitmap from system ram to video ram. All zero source
bitmap bytes indicate destination byte to be left unchanged.
Source Bitmap structure:
Width:byte, Height:byte, Bitmap data (plane 0)...Bitmap data (plane 1)..,
Bitmap data (plane 2)..,Bitmap data (plane 3)..
NOTE: width is in bytes ie lots of 4 pixels
LIMITATIONS: No clipping is supported
Only supports bitmaps with widths which are a multiple of
4 pixels
See Also: XBMTOOLS module for linear <-> planar bitmap conversion
functions.
x_put_pbm
---------
C Prototype: extern void x_put_pbm(WORD X, WORD Y, WORD ScrnOffs,
BYTE far * Bitmap);
Write a planar bitmap from system ram to video ram.
Source Bitmap structure:
Width:byte, Height:byte, Bitmap data (plane 0)...Bitmap data (plane 1)..,
Bitmap data (plane 2)..,Bitmap data (plane 3)..
NOTE: width is in bytes ie lots of 4 pixels
LIMITATIONS: No clipping is supported
Only supports bitmaps with widths which are a multiple of
4 pixels
See Also: XBMTOOLS module for linear <-> planar bitmap conversion
functions.
x_get_pbm
---------
C Prototype: extern void x_get_pbm(WORD X, WORD Y,BYTE Bw,BYTE Bh,
WORD ScrnOffs, BYTE far * Bitmap);
Read a planar bitmap to system ram from video ram.
Source Bitmap structure:
Width:byte, Height:byte, Bitmap data (plane 0)...Bitmap data (plane 1)..,
Bitmap data (plane 2)..,Bitmap data (plane 3)..
NOTE: width is in bytes ie lots of 4 pixels
LIMITATIONS: No clipping is supported
Only supports bitmaps with widths which are a multiple of
4 pixels
See Also: XBMTOOLS module for linear <-> planar bitmap conversion
functions.
--------------------------------------------------------------------------
MODULE XPBMCLIP
--------------------------------------------------------------------------
This module implements a similar set of functions to operate on planar
bitmaps as "XPBITMAP" but incorporates clipping to a user defined
clipping rectangle (which is set by "x_set_cliprect" in module xmain).
The planar bitmap format is identical to the above module
There are three variations of the functions in XPBITMAP in this module
identified by the three function name extensions: _clipx, _clipy _clipxy.
Because speed is critical in games programming you do not want to be
checking for clipping if not necessary thus for sprites that move only
horizontally you would use the _clipx version of the put function,
for sprites that move vertically you would use the _clipy version and for
sprites that move both directions you would use the clipxy version.
Keep in mind also that the clipping components of these functions assume
that the clipping rectangle is equal to or larger than the size of the
bitmap ie. if a bitmap is top clipped, it is assumed that the bitmap's
bottom is not also clipped. Similarly with horizontal clipping.
Note: performance in decreasing order is as follows.
_clipy,_clipx,_clipxy with masked puts being slower than unmasked
puts
Horizontal clipping is performed to byte boundaries (4 pixels) rather than
pixels. This allows for the fastest implementation of the functions. It is
not such a handicap because for one, your screen width a multiple of 4
pixels wide and for most purposes it is the screen edges that form the
clipping rectangle.
Following is an example of setting a clipping rectangle to the logical
screen edges:
x_set_cliprect(0,0,ScrnLogicalByteWidth,ScrnLogicalHeight)
ASM SOURCES
xpbmclip.asm xpbmclip.inc xlib.inc model.inc
C HEADER FILE
xpbmclip.h
EXPORT FUNCTIONS
x_put_pbm_clipx
---------------
x_put_pbm_clipy
---------------
x_put_pbm_clipxy
----------------
x_put_masked_pbm_clipx
----------------------
x_put_masked_pbm_clipy
----------------------
x_put_masked_pbm_clipxy
-----------------------
For a detailed description of parameters etc. see equivalent functions
in module "XPBITMAP".
--------------------------------------------------------------------------
MODULE XCBITMAP
--------------------------------------------------------------------------
XCBITMAP:
The Care and Feeding of Compiled Masked Blits
by Matthew MacKenzie
The XCBITMAP module of the Xlib library is made up of the files
XCBITMAP.ASM, XCBITMAP.INC, and XCBITMAP.H.
The XCBITMAP module is small, containing only three procedures:
o x_compile_bitmap compiles your bitmap into native code which writes
to the VGA screen in an X mode.
o x_put_cbitmap converts X and Y coordinates into a location on the
screen, sets up the necessary VGA registers, and executes the compiled
bitmap as a subroutine.
o x_sizeof_cbitmap takes a planar bitmap and returns an integer equal to
the size of the compiled bitmap which the planar bitmap would produce.
It is essentially a lobotomized version of x_compile_bitmap, with all
the code generation replaced with a size counter.
x_compile_bitmap scans through a source bitmap and generates 8086
instructions to plot every nonzero pixel. It is designed to be used
before the action begins rather than on-the-fly. The compiled bitmap
contains no branches, and no reference to the zero (transparent) pixels.
Where two pixels are exactly four columns apart they are plotted with a
single 16-bit store, and the VGA MAP_MASK register will be set at most
four times. As a result your bitmap may run several times faster than a
traditional memory-to-VGA masked blit routine.
There is no way to perform clipping on these bitmaps, or to plot a
pixel of color zero.
x_compile_bitmap works with bitmaps in the standard Xlib planar bitmap
format. On a time scale of 60 frames per second, it is actually relatively
slow. Since a compiled bitmap is relocatable you may just want to have it
saved to disk, and not include the source bitmap in your program at all.
The source bitmap format is an array of bytes, a little like this:
char eye[] ={4, 7, /* four byte columns across, seven rows tall */
0, 0, 0, 0, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 9, 9, 1, 1, 1, 4, 4, 9, 9, 0, 0, 0, 0, 0,
0, 9, 9, 1, 2, 0, 0, 4, 4, 1, 9, 9, 0, 0, 0, 0,
9, 9, 9, 1, 0, 0, 0, 0, 1, 1, 9, 9, 9, 0, 0, 0,
0, 9, 9, 1, 2, 0, 0, 2, 1, 1, 9, 9, 0, 0, 0, 0,
0, 0, 9, 9, 1, 1, 1, 1, 1, 9, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0};
This is actually a linear bitmap, which is the wrong format for
compilation, but is easier on human eyes. Use the module XBMTOOLS to
convert linear bitmaps into planar bitmaps, and vice-versa.
To compile this image for a mode 360 pixels (90 byte columns) across:
char planar_eye[4*7 + 2];
char far * EyeSize;
(void) x_bm_to_pbm((char far *) eye, (char far *) planar_eye);
EyeSize = x_sizeof_cbitmap((far char *) planar_eye);
CompiledEye = farmalloc(EyeSize);
(void) x_compile_bitmap(90, (far char *) planar_eye, CompiledEye);
Notice that both buffers must exist beforehand. Since x_compile_bitmap
returns the size of the compiled code, in bytes, you can reallocate the
bitmap immediately to the right size if using x_sizeof_xbitmap seems
inconvenient (reallocation may even be faster, though using the function is
cleaner). The pointers are 32-bit because compiled bitmaps take so much
space: they are at one end of the speed-versus-memory spectrum. A good
rule of thumb is to allocate (3.5 x buffer-height x buffer-width) + 25
bytes (rounding up ;-), then pare your bitmap down when you find out how
much space you've actually used.
Since the compiled bitmap has to fit within one segment of memory, it
cannot contain more than about 19,000 pixels. This will not be a
limitation for most sane programmers. If you are not a sane programmer try
splitting your huge, unwieldy image up into smaller parts -- you can use
the same gigantic bitmap if you divide it into horizontal slices for
compilation. For that matter, dividing the source up that way will let
you use a source bitmap large than 64K, which is an even sicker idea...
Back to business. A bitmap is compiled for only one width of screen.
If you are using a logical screen larger than your physical screen, call
the bitmap compiler with the logical width -- the important thing is the
number of bytes per line. Notice that you do not have to be in a graphics
mode to use this routine. This allows you to develop and compile bitmaps
separately, with whatever utility programs you might cook up.
The final function is x_put_cbitmap. To plot our eye at (99,4), on
the page which starts at location 0:
x_put_cbitmap(99, 4, 0, CompiledEye);
This function depends on the global variable ScrnLogicalByteWidth from
the module XMAIN, which should be the same number as the column parameter
you used to compile your bitmap.
The XCBITMAP module supports memory-to-VGA blits only. Xlib also
includes non-masking routines which can quickly save and restore the
background screen behind your bitmap, using fast string operations.
This module is part of the Xlib package, and is in the public domain.
If you write something which uses it, though, please send me a copy as a
courtesy -- if for no other reason so I can tilt my chair back and reflect
that it may have been worth the trouble after all.
The included program DEMO2.C demonstrates the performance difference
between planar bitmap masked blits and compiled bitmap blits.
--------------------------------------------------------------------------
MODULE XVBITMAP
--------------------------------------------------------------------------
The XVBITMAP module implements yet another type of bitmap to complement
planar and compiled bitmaps, VRAM based bitmaps. If a 4 cylinder car is
analagous to planar bitmaps, that is thrifty on memory consumption but low
performance and and a V8 is analagous to Compiled bitmaps, memory guzzlers
that really fly, then VRAM based bitmaps are the 6 cylinder modest performers
with acceptable memory consumption.
To summarise their selling points, VBM's are moderately fast with fair memory
consumption, and unlike compiled bitmaps, can be clipped. The disadvantages
are that they are limited by the amount of free video ram and have a complex
structure.
The VRAM bitmap format is rather complex consisting of components stored in
video ram and components in system ram working together. This complexity
necessitates the existence of a creation function "x_make_vbm" which takes
an input linear bitmap and generates the equivalent VBM (VRAM Bit Map).
VBM structure:
WORD 0 Size Total size of this VBM structure in bytes
WORD 1 ImageWidth Width in bytes of the image (for all alignments)
WORD 2 ImageHeight Height in scan lines of the image
WORD 3 Alignment 0 ImagePtr Offset in VidRAM of this aligned image
+--WORD 4 MaskPtr Offset (within this structure's DS) of
| . alignment masks
| .
| .
| WORD 9 Alignment 3 ImagePtr Offset in VidRAM of this aligned image
+|--WORD 10 MaskPtr Offset (within this structure's DS) of
|| alignment masks
||
|+->BYTE 21 (WORD 11) -------+-- Image masks for alignment 0
| . |
| . |
| BYTE 21 + ImageWidth*ImageHeight -----+
|
| .
| . (similaly for alignments 1 - 2 )
| .
|
+-->BYTE 21 + 3*ImageWidth*ImageHeight + 1-+-- Image masks for alignment 3
. |
. |
BYTE 21 + 4*(ImageWidth*ImageHeight) --+
.
.
<< Similarly for alignments 2 and 3 >>
.
.
BYTE 21 + 4*(ImageWidth*ImageHeight)
-------------
(And dont forget the corresponding data in video ram)
You can see for yourself the complexity of this bitmap format. The image
is stored in video ram in its 4 different alignments with pointers to these
alignments in the VBM. Similarly there are 4 alignments of the corresponding
masks within the VBM itself (towards the end). The mask bytes contain the
plane settings for the corresponding video bytes so that one memory move can
move up to 4 pixels at a time (depending on the mask settings) using the
VGA's latches, theoretically giving you a 4x speed improvement over
conventional blits like the ones implemented in "XPBITMAP". In actual fact
its anywhere between 2 and 3 due to incurred overheads.
These bitmaps are more difficult to store in files than PBM'S and CBM's but
still posible with a bit of work, so do not dismiss these as too difficult
to use. Consider all the bitmap formats carefully before deciding on which
to use. There may even be situations that a careful application of all three
types would be most effective ie. compiled bitmaps for Background tiles and
the main game character (which never need clipping), VRAM based bitmaps for
the most frequently occuring (oponent, alien etc) characters which get
clipped as they come into and leave your current location and planar bitmaps
for smaller or less frequently encountered characters.
ASM SOURCES
xvbitmap.asm xvbitmap.inc xlib.inc model.inc
xmakevbm.c - Additional C module implementing creation function
C HEADER FILE
xvbitmap.h
EXPORTED FUNCTIONS
x_make_vbm
----------
C Prototype: extern char far * x_make_vbm(char far *lbm, WORD *VramStart);
Create the VBM from the given linear bitmap and place the image alignments
in video ram starting at the offset in the variable pointed to by
"VramStart". "VramStart" is then updated to point to the next free VRAM byte
(just after the last byte of the image alignments). Usually you will point
"VramStart" to "NonVisual_Offs".
lbm Pointer to the input linear bitmap
VramStart Pointer to variable containing Offset of first free VRAM byte
x_put_masked_vbm
----------------
C Prototype: extern void x_put_masked_vbm(int X, int Y, WORD ScrnOffs,
BYTE far * VBitmap);
Draw a VRAM based bitmap at (X,Y) relative to the screen with starting
offset "ScrnOffs".
x_put_masked_vbm_clipx
----------------------
x_put_masked_vbm_clipy
----------------------
x_put_masked_vbm_clipxy
-----------------------
Clipping versions of "x_put_masked_vbm".
See XPBMCLIP for more details on the type of clipping used as it is
identical to XVBITMAP.
--------------------------------------------------------------------------
MODULE XMOUSE
--------------------------------------------------------------------------
The XMOUSE module implements very basic mouse handling functions. The way
in which it operates is by installing an event handler function during
initialization which subsequently intercepts and processes mouse events and
automatically updates status variables such as mouse position and button
pressed status. It does not support the full functionality of:
SPLIT SCREENS
SCROLLED WINDOWS
VIRTUAL WINDOWS
This was done to primarily prevent unecessary impedences to performance,
since the mouse handler function has the potential to degrade performance.
It also saves me alot of coding which I was too lazy to do.
Programs communicate with the mouse driver as with other devices, through
an interrupt vector namely 33h. On generating an interrupt, the mouse driver
expects a function number in AX and possibly other parameters in other
registers and returns information via the registers. A brief description
of the mouse functions follows:
--------------------------------------
MS Mouse Driver Functions
Mouse Initialization 0
Show Cursor 1
Hide Cursor 2
Get Mouse Position & Button Status 3
Set Mouse Cursor Position 4
Get Button Press Information 5
Get Button Release Information 6
Set Min/Max Horizontal Position 7
Set Min/Max Vertical Position 8
Define Graphics Cursor Block 9
Define Text Cursor 10
Read Mouse Motion Counters 11
Define Event Handler 12
Light Pen Emulation Mode ON 13
Light Pen Emulation Mode OFF 14
Set Mouse Mickey/Pixel Ratio 15
Conditional Hide Cursor 16
Set Double-Speed Threshold 19
--------------------------------------
In practice only afew of these functions are used and even fewer when the
mouse status is monitored by an event handler function such as is used in
this module.
The most important thing to note when using the mouse module is that the
mouse event handler must be removed before exiting the program. It is a good
idea to have an exit function (see the C "atexit" function) and include the
line "x_mouse_remove();" along with any other pre-exit cleanup code.
ASM SOURCES
xmouse.asm xlib.inc model.inc
C HEADER FILE
xmouse.h
EXPORTED VARIABLES
MouseInstalled - WORD - Indicates whether mouse handler installed
MouseHidden - WORD - Indicates whether mouse cursor is hidden
MouseButtonStatus - WORD - Holds the mouse button status
MouseX - WORD - Current X position of mouse cursor
MouseY - WORD - Current Y position of mouse cursor
MouseFrozen - WORD - Disallows position updates if TRUE
MouseColor - BYTE - The mouse cursors colour
EXPORTED FUNCTIONS
x_mouse_init
------------
C Prototype: int x_mouse_init()
Initialize the mouse driver functions and install the mouse event handler
function. This is the first function you must call before using any of the
mouse functions. This mouse code uses the fastest possible techniques to
save and restore mouse backgrounds and to draw the mouse cursor.
WARNING: This function uses and updates "NonVisual_Offset" to allocate
video ram for the saved mouse background.
LIMITATIONS: No clipping is supported horizontally for the mouse cursor
No validity checking is performed for NonVisual_Offs
**WARNING** You must Hide or at least Freeze the mouse cursor while drawing
using any of the other XLIB modules since the mouse handler may
modify vga register settings at any time. VGA register settings
are not preserved which will result in unpredictable drawing
behavior. If you know the drawing will occur away from the
mouse cursor set MouseFrozen to TRUE (1), do your drawing
then set it to FALSE (0). Alternatively call "x_hide_mouse",
perform your drawing and then call "x_show_mouse". Another
alternative is to disable interrupts while drawing but usually
drawing takes up alot of time and having interrupts disabled
for too long is not a good idea.
x_define_mouse_cursor
---------------------
C Prototype:
void x_define_mouse_cursor(char far *MouseDef, unsigned char MouseColor)
MouseDef - a pointer to 14 characters containing a bitmask for all the
cursor's rows.
MouseColor - The colour to use when drawing the mouse cursor.
Define a mouse cursor shape for use in subsequent cursor redraws. XMouse
has a hardwired mouse cursor size of 8 pixels across by 14 pixels down.
WARNING: This function assumes MouseDef points to 14 bytes.
Note: Bit order is in reverse. ie bit 7 represents pixel 0 ..
bit 0 represents pixel 7 in each "MouseDef" byte.
x_show_mouse
------------
C Prototype: void x_show_mouse()
Makes the cursor visible if it was previously hidden.
See Also: "x_hide_mouse".
x_hide_mouse
------------
C Prototype: void x_hide_mouse()
Makes the cursor hidden if it was previously visible.
See Also: "x_show_mouse".
x_remove_mouse
--------------
C Prototype: void x_remove_mouse()
Stop mouse event handling and remove the mouse handler.
NOTE: This function MUST be called before quitting the program if
a mouse handler has been installed
x_position_mouse
----------------
C Prototype void x_position_mouse(int x, int y)
Positions the mouse cursor at the specified location
x_update_mouse
--------------
C Prototype: void x_update_mouse()
Forces the mouse position to be updated and cursor to be redrawn.
Note: this function is useful when you have set "MouseFrozen" to true.
Allows the cursor position to be updated manually rather than
automatically by the installed handler.
--------------------------------------------------------------------------
MODULE XBMTOOLS
--------------------------------------------------------------------------
This module implements a set of functions to convert between planar
bitmaps and linear bitmaps.
PLANAR BITMAPS
Planar bitmaps as used by these functions have the following structure:
BYTE 0 The bitmap width in bytes (4 pixel groups) range 1..255
BYTE 1 The bitmap height in rows range 1..255
BYTE 2..n1 The plane 0 pixels width*height bytes
BYTE n1..n2 The plane 1 pixels width*height bytes
BYTE n2..n3 The plane 2 pixels width*height bytes
BYTE n3..n4 The plane 3 pixels width*height bytes
as used by x_put_pbm, x_get_pbm, x_put_masked_pbm.
LINEAR BITMAPS
Linear bitmaps have the following structure:
BYTE 0 The bitmap width in pixels range 1..255
BYTE 1 The bitmap height in rows range 1..255
BYTE 2..n The width*height bytes of the bitmap
ASM SOURCES
xbmtools.asm xpbmtools.inc model.inc
C HEADER FILE
xbmtools.h
MACROS
BM_WIDTH_ERROR
LBMHeight(lbitmap) - Height of linear bitmap "lbitmap"
LBMWidth(lbitmap) - Width of linear bitmap "lbitmap"
PBMHeight(pbitmap) - Height of planar bitmap "pbitmap"
PBMWidth(pbitmap) - Width of planar bitmap "pbitmap"
LBMPutPix(x,y,lbitmap,color) - set pixel (x,y) colour in linear bitmap
LBMGetPix(x,y,lbitmap) - colour of pixel (x,y) in linear bitmap
EXPORT FUNCTIONS
x_pbm_to_bm
------------
C Prototype: extern int x_pbm_to_bm(char far * source_pbm,
char far * dest_bm);
This function converts a bitmap in the planar format to the linear format
as used by x_compile_bitmap.
WARNING: the source and destination bitmaps must be pre - allocated
NOTE: This function can only convert planar bitmaps that are suitable.
If the source planar bitmap's width (per plane) is >= 256/4
it cannot be converted. In this situation an error code
BM_WIDTH_ERROR. On successful conversion 0 is returned.
x_bm_to_pbm
------------
C Prototype: extern int x_bm_to_pbm(char far * source_pbm,
char far * dest_bm);
This function converts a bitmap in the linear format as used by
x_compile_bitmap to the planar formap.
WARNING: the source and destination bitmaps must be pre - allocated
NOTE: This function can only convert linear bitmaps that are suitable.
If the source linear bitmap's width is not a multiple of 4
it cannot be converted. In this situation an error code
BM_WIDTH_ERROR. On successful conversion 0 is returned.